package co.edu.usbcali.presentation.backingBeans;

import co.edu.usbcali.modelo.*;
import co.edu.usbcali.modelo.control.Archivos;
import co.edu.usbcali.modelo.dto.EventosDTO;
import co.edu.usbcali.modelo.dto.TipoEventosDTO;
import co.edu.usbcali.presentation.businessDelegate.IBusinessDelegatorView;
import co.edu.usbcali.utilities.*;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;


import java.io.Serializable;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TimeZone;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.servlet.ServletContext;

import org.primefaces.component.calendar.*;
import org.primefaces.component.commandbutton.CommandButton;
import org.primefaces.component.inputtext.InputText;
import org.primefaces.component.selectonemenu.SelectOneMenu;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.event.map.OverlaySelectEvent;
import org.primefaces.model.StreamedContent;
import org.primefaces.model.map.DefaultMapModel;
import org.primefaces.model.map.LatLng;
import org.primefaces.model.map.MapModel;
import org.primefaces.model.map.Marker;

@ManagedBean
@ViewScoped
public class EventosView implements Serializable {

    private static final long serialVersionUID = 1L;
    private InputText txtAltitud;
    private InputText txtDireccion;
    private InputText txtHora;
    private InputText txtLatitud;
    private InputText txtNombre;
    private InputText txtIdTe_TipoEventos;
    private InputText txtIdE;
    private Calendar txtFecha;
    private CommandButton btnSave;
    private CommandButton btnModify;
    private CommandButton btnDelete;
    private CommandButton btnClear;
    private List<EventosDTO> data;
    private EventosDTO selectedEventos;
    private boolean showDialog;
    private SelectOneMenu txtTipoEvento;
    private Map<String, Long> tipoEventos = new HashMap<String, Long>();
    private String selectItemTEvento;
    private MapModel emptyModel;
    private String nombre;
    private double lat;
    private double lng;
    private String direccion;
    private Date fecha;
    private String fecha2;
    private String tipoEvento;
    private Date hora;
    private String hora2;
    private String paginaEvento;
    private List<EventosDTO> listaEventos;
    private Marker marker;
    private List<Foto> fotos = new ArrayList<Foto>();
    private Foto foto;
    private ArrayList<String> fotos2 = new ArrayList<String>();
    private List<FileUploadEvent> fileEvents=new ArrayList<FileUploadEvent>();
    private List<StreamedContent> images;


    @ManagedProperty(value = "#{BusinessDelegatorView}")
    private IBusinessDelegatorView businessDelegatorView;
    

    public EventosView() {

    }

    @PostConstruct
    public void cargarEventos() {
        try {
            emptyModel = new DefaultMapModel();
            listaEventos = new ArrayList<EventosDTO>();
            listaEventos.addAll(businessDelegatorView.getDataEventos());

            for (EventosDTO listaEvento : listaEventos) {
                EventosDTO e = new EventosDTO();

                double latitud;
                double altitud;
                e = listaEvento;
                latitud = Double.parseDouble(e.getLatitud());
                altitud = Double.parseDouble(e.getAltitud());
                emptyModel
                        .addOverlay(new Marker(new LatLng(latitud, altitud), e
                                        .getNombre(), e,
                                        "http://maps.google.com/mapfiles/ms/micons/blue-dot.png"));

                //emptyModel.addOverlay(new Marker);
            }

        } catch (Exception ex) {
            // FacesContext.getCurrentInstance().addMessage("Error", new
            // FacesMessage(ex.getMessage()));
        }
    }

    public InputText getTxtAltitud() {
        return txtAltitud;
    }

    public void setTxtAltitud(InputText txtAltitud) {
        this.txtAltitud = txtAltitud;
    }

    public InputText getTxtDireccion() {
        return txtDireccion;
    }

    public void setTxtDireccion(InputText txtDireccion) {
        this.txtDireccion = txtDireccion;
    }

    public InputText getTxtHora() {
        return txtHora;
    }

    public void setTxtHora(InputText txtHora) {
        this.txtHora = txtHora;
    }

    public InputText getTxtLatitud() {
        return txtLatitud;
    }

    public void setTxtLatitud(InputText txtLatitud) {
        this.txtLatitud = txtLatitud;
    }

    public InputText getTxtNombre() {
        return txtNombre;
    }

    public void setTxtNombre(InputText txtNombre) {
        this.txtNombre = txtNombre;
    }

    public InputText getTxtIdTe_TipoEventos() {
        return txtIdTe_TipoEventos;
    }

    public void setTxtIdTe_TipoEventos(InputText txtIdTe_TipoEventos) {
        this.txtIdTe_TipoEventos = txtIdTe_TipoEventos;
    }

    public Calendar getTxtFecha() {
        return txtFecha;
    }

    public void setTxtFecha(Calendar txtFecha) {
        this.txtFecha = txtFecha;
    }

    public InputText getTxtIdE() {
        return txtIdE;
    }

    public void setTxtIdE(InputText txtIdE) {
        this.txtIdE = txtIdE;
    }

    public List<EventosDTO> getData() {
        try {
            if (data == null) {
                data = businessDelegatorView.getDataEventos();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return data;
    }

    public void setData(List<EventosDTO> eventosDTO) {
        this.data = eventosDTO;
    }

    public EventosDTO getSelectedEventos() {
        return selectedEventos;
    }

    public void setSelectedEventos(EventosDTO eventos) {
        this.selectedEventos = eventos;
    }

    public CommandButton getBtnSave() {
        return btnSave;
    }

    public void setBtnSave(CommandButton btnSave) {
        this.btnSave = btnSave;
    }

    public CommandButton getBtnModify() {
        return btnModify;
    }

    public void setBtnModify(CommandButton btnModify) {
        this.btnModify = btnModify;
    }

    public CommandButton getBtnDelete() {
        return btnDelete;
    }

    public void setBtnDelete(CommandButton btnDelete) {
        this.btnDelete = btnDelete;
    }

    public CommandButton getBtnClear() {
        return btnClear;
    }

    public void setBtnClear(CommandButton btnClear) {
        this.btnClear = btnClear;
    }

    public TimeZone getTimeZone() {
        return java.util.TimeZone.getDefault();
    }

    public IBusinessDelegatorView getBusinessDelegatorView() {
        return businessDelegatorView;
    }

    public void setBusinessDelegatorView(
            IBusinessDelegatorView businessDelegatorView) {
        this.businessDelegatorView = businessDelegatorView;
    }

    public boolean isShowDialog() {
        return showDialog;
    }

    public void setShowDialog(boolean showDialog) {
        this.showDialog = showDialog;
    }

    public void onMarkerSelect(OverlaySelectEvent event) {
        try {
            setMarker((Marker) event.getOverlay());
            Marker m = getMarker();

            EventosDTO e = (EventosDTO) m.getData();

            nombre = e.getNombre();

            DateFormat df = DateFormat.getDateInstance();
            String s = df.format(e.getFecha());
            fecha2 = s;
            hora2 = e.getHora();
            direccion = e.getDireccion();
            tipoEvento = businessDelegatorView.getTipoEventos(e.getIdTe_TipoEventos()).getNombret();
            //List<StreamedContent>
            listaFotosEvento(e.getIdE());

        } catch (Exception e1) {
            e1.printStackTrace();
        }

    }

    public String addMarker(ActionEvent actionEvent) {

        try {
            Eventos e = new Eventos();

            e.setNombre(nombre);
            e.setFecha(fecha);

            TipoEventos tEvento = businessDelegatorView.getTipoEventos(Long.parseLong(selectItemTEvento));

            if (hora.getHours() == 0) {
                if (hora.getMinutes() == 0) {
                    e.setHora("00:00");
                }
            } else if (hora.getMinutes() == 0) {
                e.setHora(hora.getHours() + ":00");
            } else {
                e.setHora(hora.getHours() + ":" + hora.getMinutes());
            }

            e.setDireccion(direccion);
            e.setLatitud(lat + "");
            e.setAltitud(lng + "");
            e.setTipoEventos(tEvento);

            //e.setImageneses(imageneses);
            businessDelegatorView.saveEventos(e);

            // 
            Archivos a = new Archivos();
            a.guardarArchivo(fileEvents, e.getIdE());

            data = businessDelegatorView.getDataEventos();

            cargarEventos();

            FacesUtils.addInfoMessage("El evento se agrego Exitosamente");
            borrarCampos();
            

        } catch (Exception ex) {
            System.out.println("Error: " + ex.getMessage());
            FacesContext.getCurrentInstance().addMessage("Error",
                    new FacesMessage(ex.getMessage()));
        }
        return "";
    }

    public void borrarCampos() {
        nombre = null;
        fecha = null;
        selectItemTEvento = "";
        hora = null;
        direccion = null;
        fileEvents = null;

    }

    public MapModel getEmptyModel() {
        return emptyModel;
    }

    public void setEmptyModel(MapModel emptyModel) {
        this.emptyModel = emptyModel;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public double getLat() {
        return lat;
    }

    public void setLat(double lat) {
        this.lat = lat;
    }

    public double getLng() {
        return lng;
    }

    public void setLng(double lng) {
        this.lng = lng;
    }

    public String getDireccion() {
        return direccion;
    }

    public void setDireccion(String direccion) {
        this.direccion = direccion;
    }

    public Date getFecha() {
        return fecha;
    }

    public void setFecha(Date fecha) {
        this.fecha = fecha;
    }

    public String getFecha2() {
        return fecha2;
    }

    public void setFecha2(String fecha2) {
        this.fecha2 = fecha2;
    }

    public String getHora2() {
        return hora2;
    }

    public void setHora2(String hora2) {
        this.hora2 = hora2;
    }

    public String getPaginaEvento() {
        return paginaEvento;
    }

    public void setPaginaEvento(String paginaEvento) {
        this.paginaEvento = paginaEvento;
    }

    public Date getHora() {
        return hora;
    }

    public void setHora(Date hora) {
        this.hora = hora;
    }

    public List<EventosDTO> getListaEventos() {
        return listaEventos;
    }

    public void setListaEventos(List<EventosDTO> listaEventos) {
        this.listaEventos = listaEventos;
    }

    public Marker getMarker() {
        return marker;
    }

    public void setMarker(Marker marker) {
        this.marker = marker;
    }

    public SelectOneMenu getTxtTipoEvento() {
        return txtTipoEvento;
    }

    public void setTxtTipoEvento(SelectOneMenu txtTipoEvento) {
        this.txtTipoEvento = txtTipoEvento;
    }

    public String getTipoEvento() {
        return tipoEvento;
    }

    public void setTipoEvento(String tipoEvento) {
        this.tipoEvento = tipoEvento;
    }

    public Map<String, Long> getTipoEventos() {
        try {
            tipoEventos= new HashMap<String, Long>();
            List<TipoEventosDTO> data2 = businessDelegatorView
                    .getDataTipoEventos();
            for (TipoEventosDTO data21 : data2) {
                tipoEventos.put(data21.getNombret(), data21.getIdTe());
            }
        } catch (Exception e) {

        }
        return tipoEventos;
    }

    public void setTipoEventos(Map<String, Long> tipoEventos) {
        this.tipoEventos = tipoEventos;
    }

    public String getSelectItemTEvento() {
        return selectItemTEvento;
    }

    public void setSelectItemTEvento(String selectItemTEvento) {
        this.selectItemTEvento = selectItemTEvento;
    }

    public void handleFileUpload(FileUploadEvent event) {
        if (fileEvents == null) {
            fileEvents = new ArrayList<FileUploadEvent>();
        }
        fileEvents.add(event);
        FacesMessage msg = new FacesMessage("Se guado con exito!", event.getFile().getFileName());
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }

    public List<StreamedContent> getImages() {
        return images;
    }

    public void setImages(List<StreamedContent> images) {
        this.images = images;
    }
    
    public void listaFotosEvento(long idEvento) {
       try {
            setFotos(businessDelegatorView.getImagenesPorEvento(idEvento));
            fotos2 = new ArrayList<String>();
            for (Foto f : getFotos()) {
                FacesContext facesContext = FacesContext.getCurrentInstance();
                ServletContext scontext = (ServletContext) facesContext.getExternalContext().getContext();
                String nomeArquivo = f.getId().toString() + ".jpg";
                String arquivo = scontext.getRealPath("/" + nomeArquivo);
                fotos2.add(arquivo); 
                crerArquivo(f.getImagen(), arquivo);
                foto=f;
            }
            System.out.println(foto);
        } catch (Exception ex) {
            System.out.println(ex);
        }
    }

    private void crerArquivo(byte[] imagen, String arquivo) {
        FileOutputStream fos;
        try {
            fos = new FileOutputStream(arquivo);
            fos.write(imagen);
            fos.close();
        } catch (FileNotFoundException ex) {
            System.out.println(ex);
        } catch (IOException ex) {
            System.out.println(ex);
        }
    }

    public List<Foto> getFotos() {
        return fotos;
    }

    public void setFotos(List<Foto> fotos) {
        this.fotos = fotos;
    }

	public ArrayList<String> getFotos2() {
		for (int i = 0; i <fotos2.size(); i++) {
			System.out.println(fotos2.get(i));
		}
		return fotos2;
	}

	public void setFotos2(ArrayList<String> fotos2) {
		this.fotos2 = fotos2;
	}

	public Foto getFoto() {
		return foto;
	}

	public void setFoto(Foto foto) {
		this.foto = foto;
	}
    
    
}
